﻿#ifndef IPMASKCALCULATE_H
#define IPMASKCALCULATE_H

#include <iostream>
#include <map>
#include <array>


class IPMaskCalculate
{
public:
    IPMaskCalculate();
    const std::map<const unsigned int,const std::array<unsigned int,4>> kaMapPrefixMask_IPv4 = {
        {32,{255,255,255,255}},{31,{255,255,255,254}},{30,{255,255,255,252}},{29,{255,255,255,248}},{28,{255,255,255,240}},
        {27,{255,255,255,224}},{26,{255,255,255,192}},{25,{255,255,255,128}},{24,{255,255,255,0}},{23,{255,255,254,0}},
        {22,{255,255,252,0}},{21,{255,255,248,0}},{20,{255,255,240,0}},{19,{255,255,224,0}},{18,{255,255,192,0}},
        {17,{255,255,128,0}},{16,{255,255,0,0}},{15,{255,254,0,0}},{14,{255,252,0,0}},{13,{255,248,0,0}},
        {12,{255,240,0,0}},{11,{255,224,0,0}},{10,{255,192,0,0}},{9,{255,128,0,0}},{8,{255,0,0,0}},{7,{254,0,0,0}},
        {6,{252,0,0,0}},{5,{248,0,0,0}},{4,{240,0,0,0}},{3,{224,0,0,0}},{2,{192,0,0,0}},{1,{128,0,0,0}}
    };

    /*
     * 计算 IPV4 网络地址
     * */
    std::array<unsigned int, 4> funArrayOfIpNetAddr_IPv4(const unsigned int &prefix, const std::array<unsigned int,4> &ip_inaddr) const;

    /*
     * 计算 IPV4 广播地址
     * */
    std::array<unsigned int, 4> funArrayOfBroadcastAddr_IPv4(const unsigned int &prefix, const std::array<unsigned int, 4> &ip_inaddr) const;

    /*
     * 计算 IPV4 网段首地址
     * */
    std::array<unsigned int,4> funArrayOfFirstAddr_IPv4(const unsigned int &prefix, const std::array<unsigned int, 4> &ip_inaddr) const;

    /*
     * 计算 IPV4 网段尾地址
     * */
    std::array<unsigned int,4> funArrayOfLastAddr_IPv4(const unsigned int &prefix, const std::array<unsigned int, 4> &ip_inaddr) const;

    /*
     * 对象计数器取数函数
     * */
    static int sFunGetCounter();

    /*
     * 重载 new delete
     * */
    void *operator new(size_t s);
    void *operator new(size_t s,void *p);
    void operator delete(void *ptr);

private:
    static int sNewCounter;

};

#endif // IPMASKCALCULATE_H
